/**
 * 
 */
package be.ipl.pigolo.servlets;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import be.ipl.pigolo.usecases.GestionPartie;
import be.ipl.pigolo.util.Util;

/**
 * Servlet implementation class Création de partie
 * 
 * @author lspitaels,sdoublier
 */
@WebServlet(name = "creationdepartie.html")
public class CreationDePartie extends HttpServlet {

	@EJB
	GestionPartie gestPartie;

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private HttpSession session;
	private String nomPartie;

	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		session = request.getSession();
		String username = "";

		synchronized (session) {
			username = (String) session.getAttribute("fermier");
		}

		if (Util.checkNullEmpty(username)) {
			String erreurSession = "Merci de vous connecter au préalable.";
			response.sendRedirect(response
					.encodeRedirectURL("accueil.html?erreurSession="
							+ erreurSession));
		} else {
			getServletContext().getNamedDispatcher("creationpartie.html")
					.forward(request, response);
		}
	}

	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		session = request.getSession();
		String username = "";
		gestPartie = null;

		synchronized (session) {
			username = (String) session.getAttribute("fermier");
			gestPartie = (GestionPartie) session.getAttribute("gestionpartie");
		}

		if (Util.checkNullEmpty(username)) {
			String erreurSession = "Merci de vous connecter au préalable.";
			response.sendRedirect(response
					.encodeRedirectURL("accueil.html?erreurSession="
							+ erreurSession));
		} else {

			nomPartie = request.getParameter("nom");
			int timerDebutPartie = Integer.parseInt((String) request
					.getParameter("timerDebutPartie"));
			int timerTourPartie = Integer.parseInt((String) request
					.getParameter("timerTourPartie"));

			if (Util.checkNullEmpty(nomPartie)) {
				request.setAttribute("erreur",
						"Le nom de la partie ne peut pas être vide");
				doGet(request, response);
				return;
			}

			try {
				if (!gestPartie.creerPartie(nomPartie, timerTourPartie)) {
					throw new Exception("La partie existe déjà !");
				}
				if (!gestPartie.rejoindrePartie(nomPartie, username)) {
					throw new Exception("Impossible de rejoindre la partie !");
				}
			} catch (Exception e) {
				request.setAttribute("erreur", "" + e.getMessage());
				doGet(request, response);
				return;
			}

			final String nomDeLaPartie = nomPartie;

			new Timer(nomDeLaPartie + "_timer").schedule(new TimerTask() {

				@Override
				public void run() {

					GestionPartie gestionPartie = null;
					String username = "";
					synchronized (session) {
						username = (String) session.getAttribute("fermier");
						gestionPartie = (GestionPartie) session
								.getAttribute("gestionpartie");
					}

					if (username == null) {
						gestionPartie.annuler(nomDeLaPartie);
						return;
					}

					if (gestionPartie.listerLesParticipants(nomDeLaPartie)
							.size() <= 1) {
						gestionPartie.annuler(nomDeLaPartie);
						return;
					}
					gestionPartie.commencerPartie(nomDeLaPartie);

				}
			}, timerDebutPartie * 1000);

			response.sendRedirect(response
					.encodeRedirectURL("jouer.html?nomPartie=" + nomPartie));
		}
	}

}
